package com.javasm.httpclient;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.javasm.commons.entity.AxiosResult;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// Java远程调用外部接口
//方式1. jdk提供远程访问 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能  HttpUrlConnection
////            目标URL
//            URL url = new URL("http://t.weather.sojson.com/api/weather/city/101030100");
//                    // 打开连接
//                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//                    // 设置请求方法为GET
//                    conn.setRequestMethod("GET");
//                    // 设置请求属性，例如User-Agent
//                    conn.setRequestProperty("User-Agent", "Mozilla/5.0");
//
////            // 设置请求方法为POST
////            conn.setRequestMethod("POST");
////            // 设置允许输出，因为我们要发送数据
////            conn.setDoOutput(true);
////            // 设置请求头，根据需要设置Content-Type等
////            conn.setRequestProperty("Content-Type", "application/json; utf-8");
//
////            // 要发送的数据
////            Map<String, String> params = new HashMap<>();
////            params.put("cityCode", "101030100");
////            params.put("param1", "value1");
////            String jsonInputString = JSON.toJSONString(params);
////
////            try(OutputStream os = conn.getOutputStream()) {
////                byte[] input = jsonInputString.getBytes("utf-8");
////                os.write(input, 0, input.length);
////            }
//
//                    // 获取响应码
//                    int responseCode = conn.getResponseCode();
//                    System.out.println("GET Response Code :: " + responseCode);
//
//                    if (responseCode == HttpURLConnection.HTTP_OK) { // 成功
//                    //  HttpURLConnection 发送请求并获取输入流来读取响应内容：
//                    InputStream in = conn.getInputStream();//读取服务端的返回数据
//                    // 将字节流转换为字符流
//                    Reader isr = new InputStreamReader(in);
//                    // 获取输入流
//                    BufferedReader bufferedReader = new BufferedReader(isr);
//                    // 读取响应内容
//                    String inputLine= bufferedReader.readLine();
//                    JSONObject obj = JSON.parseObject(inputLine);
//                    JSONObject dataObj = obj.getJSONObject("data");
//                    //解析返回的数据
//                    String pm25 = dataObj.getString("pm25");
//                    //在处理文件或网络资源时，使用完 InputStream 或其子类（如 BufferedReader）后，应该调用 close() 方法来释放系统资源，避免资源泄露。
//                    bufferedReader.close();
//
//                    // 打印结果
//                    System.out.println(inputLine);
//                    } else {
//                    System.out.println("GET Request Not Worked");
//                    }

//方式2：第三方组件httpclient  httpclient 是 apache 开源组织提供的用于访问 http 协议的客户端组件，是对http 协议的封装，它比 JDK 自带的 HttpUrlConnection 更加方便，功能更加强大。
//      httpclient不支持异步远程调用, 后续提供okhttp解决异步远程调用
//      OKhttp: 支持异步远程调用 OkHttp 是一个高效的 HTTP 客户端库，用于 Android 和 Java 应用程序。它简化了 HTTP 请求和响应的处理，并支持同步和异步调用。
//  get请求
//        OkHttpClient client = new OkHttpClient();
//        Request request = new Request.Builder().url("http://t.weather.sojson.com/api/weather/city/101030100").build();
//        Response response = client.newCall(request).execute();
//        String   datas= response.body().string();
//  post请求
//          OkHttpClient client = new OkHttpClient();
//          MediaType JSON = MediaType.get("application/json; charset=utf-8");
//          String json = "{\"param1\": \"value1\", \"param2\": \"value2\"}";
//          RequestBody body = RequestBody.create(json, JSON);
//
//          Request request = new Request.Builder()
//          .url("http://example.com/api")
//          .post(body)
//          .build();
//        Response response = client.newCall(request).execute();
//        String   datas= response.body().string();



//方式3. spring框架 提供的远程访问 spring 提供了 RestTemplate 是httpUrlConnection对象的封装,进行远程接口访问的工具对象 spring框架下，无需引入组件  (常用)
public class TestRestTempalte {
    @Resource
    private RedisTemplate<String,Object> redisTemplate;
    public static void main(String[] args) throws IOException{
//     get请求
         //restTemplate
        RestTemplate restTemplate = new RestTemplate();
        String cityCode="101030100";
        String url="http://t.weather.sojson.com/api/weather/city/{code}";
        Map<String,String> map = new HashMap<>();
        map.put("code",cityCode);
        //url请求的地址  String.class 返回值的类型  map请求的参数
//        getForEntity 和 getForObject 两个方法都是get请求 区别： getForEntity 方法返回一个 ResponseEntity<T> 对象，它包含了 HTTP 响应的状态码、头部信息和响应体。这个方法允许你访问完整的响应信息；
//                                                            getForObject 方法直接返回响应体的内容，它简化了代码，但不会返回 HTTP 状态码和头部信息
//
        ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class, map);
        //请求头
        HttpHeaders headers = forEntity.getHeaders();

//        String body = restTemplate.getForObject(url, String.class,map);
        String body = forEntity.getBody();
        //解析返回的数据
        JSONObject jsonObject = JSON.parseObject(body);
        JSONObject data = jsonObject.getJSONObject("data");
        JSONArray forecast = data.getJSONArray("forecast");
        int size = forecast.size();
        List<Object> objects = forecast.subList(0, size - 1);
        //解析完成后的数据缓存到redis中
//        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
//        redisTemplate.opsForList().leftPushAll("weather",objects);
        System.out.println(body);
////  post请求
//        String url="http://localhost:8080/sysUser";
//        RestTemplate restTemplate = new RestTemplate();
//        Map<String,String> maps = new HashMap<>();
//        maps.put("uname","dddddd");
//        maps.put("uphone","111111");
//
//        //RestTemplate依赖于jackson组件,做对象与json字符串之间互转
//        AxiosResult s = restTemplate.postForObject(url, maps, AxiosResult.class);//默认的请求头Content-type:application/json  返回值类型<T>：AxiosResult.class
//        System.out.println(s);
////  put请求
//        restTemplate.put(url,maps);//可以向请求体放数据，没有返回值
////  delete请求
//        String ids = "20,42,43,44";
//        restTemplate.delete(url,ids);//没有请求体，没有返回值
//     exchange 用法：  设置请求头,请求体 获取响应头,响应体


//        String url="http://localhost:8080/sysUser";
//        HttpHeaders reqHeaders = new HttpHeaders();
//        reqHeaders.add("admin_token","adasdfasdf4rwedcerfwerwewes");
//        Map<String,String> reqBody = new HashMap<>();
//        reqBody.put("id","18");
//        reqBody.put("uname","dddddd");
//        reqBody.put("uphone","111111");
//        RestTemplate t = new RestTemplate();
//        //设置请求头,请求体
//        HttpEntity reqEntity = new HttpEntity(reqBody,reqHeaders);
//
//        //获取响应头,响应体
//        ResponseEntity<AxiosResult> respEntity = t.exchange(url, HttpMethod.PUT, reqEntity, AxiosResult.class);
//        HttpHeaders respHeaders = respEntity.getHeaders();
//        AxiosResult respBody = respEntity.getBody();
    }
}
